home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 001-025 / scopedisk14 / tcell / vk.mod < prev   
Text File  |  1995-03-18  |  5KB  |  183 lines

  1. (*===========================================================================*)
  2. (*                             Virus Check                                   *)
  3. (*===========================================================================*)
  4. (*                                                                           *)
  5. (*              Original : Writen by David Siebert                           *)
  6. (*                         08-feb-88                                         *)
  7. (*===========================================================================*)
  8. (*                                                                           *)
  9. (*             Modified  : 02-may-88 David Siebert                           *)
  10. (*                         converted a program to module                     *)
  11. (*                         03-may-88 David Siebert                           *)
  12. (*                         found the bug in the program                      *)
  13. (*                                                                           *)
  14. (*===========================================================================*)
  15. IMPLEMENTATION MODULE VK;
  16. FROM CharCheck IMPORT IsPrintable,IsVowel;
  17. FROM SYSTEM IMPORT TSIZE,ADDRESS;
  18. FROM IO IMPORT DoIO,IOStdReq,IORequest,IORequestPtr;
  19. FROM TrackDiskDevice IMPORT IOExtTD,TDSector,NrSecs,TDMotor,ETDRead,
  20. TrackDiskName,TDChangeNum;
  21. FROM PortUtils IMPORT CreatePort,CreateExtIO,DeletePort,DeleteExtIO;
  22. FROM Ports IMPORT MsgPortPtr;
  23. FROM Memory IMPORT MemChip,AllocMem,FreeMem,MemReqSet;
  24. FROM Devices IMPORT OpenDevice,CloseDevice;
  25.  
  26.  
  27. (* $S-,$T-,$A+ *)
  28. PROCEDURE VCheck (Drive:LONGCARD;VAR MySec:TDD):BOOLEAN;
  29. TYPE
  30.    LookString = ARRAY[1..4] OF CHAR;
  31.  
  32. CONST
  33.   ON       = 1;
  34.  OFF       = 0;
  35.  NumOfCyl  = 80;
  36.  NumOfHead = 2;
  37.  
  38. VAR 
  39.   DTA       : ADDRESS;
  40.   DumbGymnastics : IORequestPtr;
  41.   reqsize   : IOExtTD;
  42.   diskreq   : POINTER TO IOExtTD;
  43.   DiskCount,
  44.   Error,
  45.   cyl,
  46.   sec,
  47.   hd       : LONGCARD;
  48.   DiskPort : MsgPortPtr;
  49.   Data     : POINTER TO LookString;
  50.   Virus,
  51.   Lcount   : INTEGER;
  52.   ByteBand ,
  53.   RetVal   : BOOLEAN;
  54.  
  55. PROCEDURE ReadCylSec(DTA:ADDRESS;cyl,sec,hd:LONGCARD):LONGCARD;
  56.   VAR
  57.     offset ,
  58.     err    : LONGCARD;
  59.   BEGIN
  60.     diskreq := ADDRESS(DumbGymnastics);
  61.     diskreq^.iotdReq.ioLength:=TDSector;
  62.     diskreq^.iotdReq.ioData:=DTA;
  63.     (* Show where data goes *)
  64.     diskreq^.iotdReq.ioReq.ioCommand:=ETDRead;
  65.     (* Calculate Offset *)
  66.     diskreq^.iotdCount:=DiskCount;
  67.     offset:=TDSector *(sec+NrSecs*hd+NrSecs*NumOfHead*cyl);
  68.     diskreq^.iotdReq.ioOffset:=offset;
  69.   DumbGymnastics:=ADDRESS(diskreq);
  70.   err:=DoIO(DumbGymnastics^);
  71.   RETURN(err);
  72. END ReadCylSec;
  73.  
  74. PROCEDURE Motor(OnOff:LONGCARD):LONGCARD;
  75. (* Turn On Disk Motor *)
  76. VAR
  77.   err : LONGCARD;
  78.  
  79. BEGIN
  80.   diskreq := ADDRESS(DumbGymnastics);
  81.   diskreq^.iotdReq.ioLength:=OnOff;
  82.   diskreq^.iotdReq.ioReq.ioCommand:=TDMotor;
  83.   DumbGymnastics:=ADDRESS(diskreq);
  84.   err:=DoIO(DumbGymnastics^);
  85. RETURN(err);
  86.   (* Return the error code to the calling program*)
  87. END Motor;
  88.  
  89. PROCEDURE Check():BOOLEAN;
  90. VAR 
  91.   vowel:BOOLEAN;
  92.   i,
  93.   j:INTEGER;
  94.   q:POINTER TO CHAR;
  95. BEGIN
  96.   Lcount:=0;
  97.   i:=284;
  98.   WHILE (Lcount<4) AND (i<408) DO
  99.     Data:=DTA+ADDRESS(i);
  100.     vowel:=FALSE;
  101.     Lcount:=0;
  102.     FOR j:=1 TO 4 DO
  103.       IF IsPrintable(Data^[j]) THEN
  104.         IF NOT vowel THEN
  105.            vowel:=IsVowel(Data^[j]);
  106.         END;(* End If*)
  107.         Lcount :=Lcount +1
  108.       ELSE
  109.         Lcount:=0
  110.       END; (*end if *);
  111.     END; (* end for*);
  112.     i:= i+1
  113.   END; (*While *)
  114.   IF (Lcount=4)AND vowel THEN
  115.     FOR i:=1 TO TDSector DO
  116.       q:=DTA+ADDRESS(i);
  117.       MySec[i]:=q^;
  118.     END ; (* end for *)
  119.     RETURN (TRUE);
  120.   ELSE 
  121.     RETURN(FALSE);
  122.   END; (*END IF*);
  123. END Check;
  124.  
  125. PROCEDURE ByteCheck():BOOLEAN;
  126. VAR 
  127.   i,
  128.   j:INTEGER;
  129.   z:CHAR;
  130.   q:POINTER TO CHAR;
  131.  
  132. BEGIN
  133.  
  134.   Lcount:=0;
  135.   i:=16;
  136.   q:=DTA+ADDRESS(i);
  137.   IF q^="V" THEN
  138.     FOR i:=1 TO TDSector DO
  139.       q:=DTA+ADDRESS(i);
  140.       MySec[i]:=q^;
  141.     END ; (* end for *)
  142.     RETURN (TRUE);
  143.   ELSE 
  144.     RETURN(FALSE);
  145.   END; (*END IF*);
  146. END ByteCheck;
  147.  
  148. BEGIN
  149.   DTA:=AllocMem(TDSector,MemReqSet{MemChip});
  150.   DiskPort := CreatePort("",0);
  151.   DumbGymnastics := CreateExtIO(DiskPort,TSIZE(IOExtTD));
  152.   Error := OpenDevice(TrackDiskName,Drive,DumbGymnastics,0);
  153.   IF Error=0 THEN
  154.      diskreq:=ADDRESS(DumbGymnastics);
  155.      diskreq^.iotdReq.ioReq.ioCommand:=TDChangeNum;
  156.      Error:=DoIO(DumbGymnastics^);
  157.      DiskCount:=diskreq^.iotdReq.ioActual;
  158.      Error:=Motor(ON);
  159.      Error:=ReadCylSec(DTA,0,0,0);
  160.      Error:=Motor(OFF);
  161.      ByteBand:=ByteCheck();
  162.      Error:=Motor(ON);
  163.      Error:=ReadCylSec(DTA,0,1,0);
  164.      Error:=Motor(OFF);
  165.      CloseDevice(DumbGymnastics);
  166.      IF (Check() OR ByteBand ) THEN
  167.         RetVal:= TRUE;
  168.      (* Virus *)
  169.      ELSE
  170.         RetVal:= FALSE;
  171.      (* no Virus  *)
  172.      END; (* end if *)
  173.   ELSE
  174.    (* if error opeing drive *)
  175.   RetVal:=FALSE; 
  176.   END; (* End IF *)
  177.   DeleteExtIO (DumbGymnastics,TSIZE(IOExtTD));
  178.   DeletePort(DiskPort);
  179.   FreeMem(DTA,TDSector);
  180.   RETURN RetVal;
  181. END VCheck;
  182. END VK.
  183.